{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Appendix B: Python tips and tricks\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Python numbers and math\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.5"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "7/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "13 % 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.75"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "3.75 % 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "2 ** 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "4 ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.10000000000002274"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1000.1 - 1000.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.273181642920008e-14"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(1000.1 - 1000.0) - 0.1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The math module"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import pi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.141592653589793"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "tau = 2 * pi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6.283185307179586"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tau"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.141592653589793"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.pi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.718281828459045"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.sqrt(25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.sin(pi/2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5000000000000001"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.cos(pi/3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.38905609893065"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.exp(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.0"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.log(math.exp(2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Random numbers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random.randint(0,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random.randint(0,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8.650956586750562"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random.uniform(7.5, 9.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Collections of data in Python\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Lists"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "months = [\"January\", \"February\", \"March\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'January'"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "months[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'February'"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "months[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'March'"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "months[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "j, f, m = months"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'January'"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "j"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'February'"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'March'"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 4, 5, 6]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[1,2,3] + [4,5,6]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### More list indexing and slicing\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['February', 'March']"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "months[1:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "nums = [0,1,2,3,4,5,6,7,8,9,10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2, 3, 4]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums[2:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(months)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "11"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(nums)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums[len(nums)-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums[-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums[1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3, 4, 5, 6, 7, 8, 9]"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums[3:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "list_of_lists = [[1,2,3],[4,5,6],[7,8,9]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list_of_lists[2][1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Iterating over a list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Month: January\n",
      "Month: February\n",
      "Month: March\n"
     ]
    }
   ],
   "source": [
    "for x in months:\n",
    "    print('Month: ' + x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "squares = []\n",
    "for n in nums:\n",
    "    squares.append(n * n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "squares"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### List comprehensions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[x * x for x in nums]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['January 2018',\n",
       " 'February 2018',\n",
       " 'March 2018',\n",
       " 'January 2019',\n",
       " 'February 2019',\n",
       " 'March 2019',\n",
       " 'January 2020',\n",
       " 'February 2020',\n",
       " 'March 2020']"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "years = [2018,2019,2020]\n",
    "[m + \" \" + str(y) for y in years for m in months]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['January 2018', 'January 2019', 'January 2020'],\n",
       " ['February 2018', 'February 2019', 'February 2020'],\n",
       " ['March 2018', 'March 2019', 'March 2020']]"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[[m + \" \" + str(y) for y in years] for m in months]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Other iterables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "range(5, 10)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "range(5,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n"
     ]
    }
   ],
   "source": [
    "for i in range(5,10):\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(range(0,10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(range(10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 3, 6, 9]"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(range(0,10,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<zip at 0x1d24ab35248>"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z = zip([1,2,3],[\"a\",\"b\",\"c\"])\n",
    "z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(1, 'a'), (2, 'b'), (3, 'c')]"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "range(5,10)[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Generators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "def count():\n",
    "    x = 0\n",
    "    while True:\n",
    "        yield x\n",
    "        x += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<generator object count at 0x000001D24AAD4CF0>"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "def count(a,b):\n",
    "    x = a\n",
    "    while x < b:\n",
    "        yield(x)\n",
    "        x += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<generator object count at 0x000001D24AAD4B88>"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "count(10,20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[x for x in count(10,20)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<generator object <genexpr> at 0x000001D24AAD4C78>"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(x*x for x in range(0,10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "def squares():\n",
    "    for x in range(0,10):\n",
    "        yield x*x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(squares())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Tuples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 2)"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(1,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('a', 'b', 'c')"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(\"a\",\"b\",\"c\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 1,2,3,4,5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(11, 12, 13, 14, 15)"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tuple(x + 10 for x in a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Sets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "dups = [1,2,3,3,3,3,4,5,6,6,6,6,7,8,9,9,9]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1, 2, 3, 4, 5, 6, 7, 8, 9}"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set(dups)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 4, 5, 6, 7, 8, 9]"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(set(dups))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set([1,1,2,2,3]) == {3,2,1}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Dictionaries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "dog = {\"name\" : \"Melba\", \"age\" : 2}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "dog = {\n",
    "    \"name\" : \"Melba\",\n",
    "    \"age\" : 2\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Melba'"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dog[\"name\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dog[\"age\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('name', 'Melba'), ('age', 2)]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(dog.items())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### NumPy arrays\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4, 5, 6])"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array([1,2,3,4,5,6])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(0,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2,\n",
       "       1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2, 2.3, 2.4, 2.5,\n",
       "       2.6, 2.7, 2.8, 2.9, 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8,\n",
       "       3.9, 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5. , 5.1,\n",
       "       5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6. , 6.1, 6.2, 6.3, 6.4,\n",
       "       6.5, 6.6, 6.7, 6.8, 6.9, 7. , 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7,\n",
       "       7.8, 7.9, 8. , 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9. ,\n",
       "       9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(0,10,0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(np.arange(0,10,0.1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Useful collection functions\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sum([1,2,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max([1,2,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "min([1,2,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "q = [3,4,1,2,5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 4, 5]"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sorted(q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3, 4, 1, 2, 5]"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<list_reverseiterator at 0x1d259f29630>"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reversed(q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[5, 2, 1, 4, 3]"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(reversed(q))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Working with functions\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "def square(x):\n",
    "    y = x * x\n",
    "    return y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "square(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Giving functions more inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "def add3(x,y,z):\n",
    "    return x + y + z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add3(1,2,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "def add(*args):\n",
    "    total = 0\n",
    "    for x in args:\n",
    "        total += x\n",
    "    return total"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(1,2,3,4,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sum([1,2,3,4,5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "add(1,2,3,4,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p = [1,2,3,4,5]\n",
    "add(*p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Keyword arguments\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "def birthday(name=\"friend\", age=None):\n",
    "    s = \"Happy birthday, %s\" % name\n",
    "    if age:\n",
    "        s += \", you're %d years old\" % age\n",
    "    return s + \"!\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Happy birthday, friend!'"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Happy birthday, Melba!'"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday('Melba')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Happy birthday, Melba!'"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday(name='Melba')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Happy birthday, Melba, you're 2 years old!\""
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday('Melba', 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Happy birthday, friend, you're 2 years old!\""
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday(age=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Happy birthday, Melba, you're 2 years old!\""
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday(age=2,name='Melba')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'name': 'Melba', 'age': 2}"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dog"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Happy birthday, Melba, you're 2 years old!\""
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday(**dog)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [],
   "source": [
    "### works exactly the same as previous implementation\n",
    "\n",
    "def birthday(**kwargs):\n",
    "    s = \"Happy birthday, %s\" % kwargs['name']\n",
    "    if kwargs['age']:\n",
    "        s += \", you're %d years old\" % kwargs['age']\n",
    "    return s + \"!\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Happy birthday, Melba, you're 2 years old!\""
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "birthday(**dog)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Functions as data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate(f,x):\n",
    "    return f(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluate(square,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<map at 0x1d259f29c50>"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "map(square,range(10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(map(square,range(10)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_power_function(power):\n",
    "    \n",
    "    def power_function(x):\n",
    "        return x ** power\n",
    "    \n",
    "    return power_function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "square = make_power_function(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "square(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [],
   "source": [
    "cube = make_power_function(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cube(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Lambdas: anonymous functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<function __main__.<lambda>(x)>"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lambda x: x + 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(lambda x: x + 2)(7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(lambda x,y: x + 2 * y)(2,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plus2 = lambda x: x + 2\n",
    "plus2(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_power_function(p):\n",
    "    return lambda x: x ** p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "make_power_function(2)(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<map at 0x1d259f3e320>"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "map(lambda x: x + 2, range(0,9))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2, 3, 4, 5, 6, 7, 8, 9, 10]"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## to see results of above\n",
    "list(map(lambda x: x + 2, range(0,9)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2, 3, 4, 5, 6, 7, 8, 9, 10]"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[x+2 for x in range(0,9)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Applying functions to NumPy arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,\n",
       "       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(np.arange(0,10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [],
   "source": [
    "def my_function(x):\n",
    "    if x % 2 == 0:\n",
    "        return x/2\n",
    "    else:\n",
    "        return 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 1., 0., 2., 0., 3., 0., 4., 0.])"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_numpy_function = np.vectorize(my_function)\n",
    "my_numpy_function(np.arange(0,10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotting data with Matplotlib\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Making a scatter plot\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAD4FJREFUeJzt3X9sXfV9xvHnqWNtVkEzXQxLDMxTVVll0xozK2KKVLGx1oxNxNU6CaaxMHVKtxUNtMoT5o+1219IXul+qlUoUbMNWKti3IzSugyYUKWNzcEZDko9UJVusSNiigxMu9oS89kf9zgzxvY998e55/rr90uyfO73nJvz6Ivuw/E5597riBAAYPt7T9kBAACtQaEDQCIodABIBIUOAImg0AEgERQ6ACSCQgeARFDoAJAICh0AErGrnTvbvXt3DAwMtHOXALDtnThx4rWI6Ku1XVsLfWBgQDMzM+3cJQBse7a/n2c7TrkAQCIodABIBIUOAImg0AEgERQ6ACSiZqHbvsb2s7ZP237J9t3Z+GdtL9g+mf3cUnxcANg+pmYXdOD+Z/QT935DB+5/RlOzC4XuL89tixclfToiXrB9uaQTtp/K1n0+Iv6kuHgAsD1NzS5ofHJOlQsrkqSF5YrGJ+ckSaND/YXss+YRekSci4gXsuW3JJ2WVEwaAEjExPT8pTJfVbmwoonp+cL2Wdc5dNsDkoYkPZ8N3WX7RdtHbV+xyXMO256xPbO0tNRUWADYLhaXK3WNt0LuQrd9maTHJN0TEW9K+oKk90vaJ+mcpM9t9LyIOBIRwxEx3NdX852rAJCEvb09dY23Qq5Ct92tapk/HBGTkhQRr0bESkS8LelBSfsLSwkA28zYyKB6urveMdbT3aWxkcHC9lnzoqhtS3pI0umIeGDN+J6IOJc9/JikU8VEBIDtZ/XC58T0vBaXK9rb26OxkcHCLohK+e5yOSDpDklztk9mY/dJut32Pkkh6YykTxaSEAC2qdGh/kILfL2ahR4R35HkDVY92fo4AIBG8U5RAEgEhQ4AiaDQASARFDoAJIJCB4BEUOgAkAgKHQASQaEDQCIodABIBIUOAImg0AEgERQ6ACSCQgeARFDoAJAICh0AEkGhA0AiKHQASASFDgCJoNABIBEUOgAkgkIHgERQ6ACQCAodABJBoQNAIih0AEgEhQ4AiaDQASARFDoAJIJCB4BEUOgAkAgKHQASQaEDQCJqFrrta2w/a/u07Zds352Nv8/2U7Zfzn5fUXxcAMBm8hyhX5T06Yj4oKQbJH3K9nWS7pX0dER8QNLT2WMAQElqFnpEnIuIF7LltySdltQv6aCkY9lmxySNFhUSAFBbXefQbQ9IGpL0vKSrIuKcVC19SVdu8pzDtmdszywtLTWXFgCwqdyFbvsySY9Juici3sz7vIg4EhHDETHc19fXSEYAQA65Ct12t6pl/nBETGbDr9rek63fI+l8MREBAHnkucvFkh6SdDoiHliz6rikQ9nyIUlfb308AEBeu3Jsc0DSHZLmbJ/Mxu6TdL+kr9r+hKT/kPSrxUQEAORRs9Aj4juSvMnqm1obBwDQKN4pCgCJoNABIBEUOgAkgkIHgERQ6ACQCAodABJBoQNAIih0AEgEhQ4AiaDQASARFDoAJIJCB4BEUOgAkAgKHQASQaEDQCIodABIBIUOAImg0AEgERQ6ACSCQgeARFDoAJAICh0AEkGhA0AiKHQASMSusgMA2D6mZhc0MT2vxeWK9vb2aGxkUKND/WXHQoZCB5DL1OyCxifnVLmwIklaWK5ofHJOkij1DsEpFwC5TEzPXyrzVZULK5qYni8pEdaj0AHksrhcqWsc7UehA8hlb29PXeNoPwodQC5jI4Pq6e56x1hPd5fGRgZLSoT1uCgKIJfVC5/c5dK5KHQAuY0O9VPgHazmKRfbR22ft31qzdhnbS/YPpn93FJsTABALXnOoX9Z0s0bjH8+IvZlP0+2NhYAoF41Cz0inpP0ehuyAACa0MxdLnfZfjE7JXNFyxIBABrSaKF/QdL7Je2TdE7S5zbb0PZh2zO2Z5aWlhrcHQCgloYKPSJejYiViHhb0oOS9m+x7ZGIGI6I4b6+vkZzAgBqaKjQbe9Z8/Bjkk5tti0AoD1q3odu+1FJN0rabfuspM9IutH2Pkkh6YykTxaYEQCQQ81Cj4jbNxh+qIAsAIAm8FkuAJAICh0AEkGhA0AiKHQASASFDgCJoNABIBEUOgAkgkIHgERQ6ACQCAodABJBoQNAIih0AEgEhQ4AiaDQASARFDoAJIJCB4BEUOgAkAgKHQASQaEDQCIodABIBIUOAImg0AEgERQ6ACSCQgeARFDoAJAICh0AEkGhA0AiKHQASASFDgCJoNABIBEUOgAkgkIHgETULHTbR22ft31qzdj7bD9l++Xs9xXFxgQA1JLnCP3Lkm5eN3avpKcj4gOSns4eAwBKVLPQI+I5Sa+vGz4o6Vi2fEzSaItzAQDq1Og59Ksi4pwkZb+vbF0kAEAjCr8oavuw7RnbM0tLS0XvDgB2rEYL/VXbeyQp+31+sw0j4khEDEfEcF9fX4O7AwDU0mihH5d0KFs+JOnrrYkDAGhUntsWH5X0T5IGbZ+1/QlJ90v6iO2XJX0kewwAKNGuWhtExO2brLqpxVkAAE2oWehAyqZmFzQxPa/F5Yr29vZobGRQo0P9ZccCGkKhY8eaml3Q+OScKhdWJEkLyxWNT85JEqWObYnPcsGONTE9f6nMV1UurGhier6kREBzKHTsWIvLlbrGgU5HoWPH2tvbU9c40OkodOxYYyOD6unuesdYT3eXxkYGS0oENIeLotixVi98cpcLUkGhY0cbHeqnwJEMTrkAQCIodABIBIUOAImg0AEgERQ6ACSCQgeARFDoAJAICh0AEkGhA0AiKHQASASFDgCJoNABIBEUOgAkgkIHgERQ6ACQCAodABJBoQNAIih0AEgEhQ4AiaDQASARFDoAJIJCB4BEUOgAkAgKHQASsauZJ9s+I+ktSSuSLkbEcCtCAQDq11ShZ34uIl5rwb8DAGgCp1wAIBHNFnpI+rbtE7YPtyIQAKAxzZ5yORARi7avlPSU7e9GxHNrN8iK/rAkXXvttU3uDgCwmaaO0CNiMft9XtLjkvZvsM2RiBiOiOG+vr5mdgcA2ELDhW77vbYvX12W9FFJp1oVDABQn2ZOuVwl6XHbq//OIxHxrZakAgDUreFCj4jvSfpQC7MAAJrQivvQ0WGmZhc0MT2vxeWK9vb2aGxkUKND/WXHAlAwCj0xU7MLGp+cU+XCiiRpYbmi8ck5SaLUgcTxxqLETEzPXyrzVZULK5qYni8pEYB2odATs7hcqWscQDoo9MTs7e2paxxAOij0xIyNDKqnu+sdYz3dXRobGSwpEYB24aJoYlYvfHKXC7DzUOgJGh3qp8CBHYhTLgCQCAodABJBoQNAIih0AEgEhQ4AiaDQASARFDoAJIJCB4BEUOgAkAgKHQASQaEDQCIodABIBIUOAImg0AEgERQ6ACSCQgeARFDoAJCIbfGNRVOzC3ylGgDU0PGFPjW7oPHJOVUurEiSFpYrGp+ckyRKHQDW6PhTLhPT85fKfFXlwoompudLSgQAnanjC31xuVLXOADsVB1f6Ht7e+oaB4CdquMLfWxkUD3dXe8Y6+nu0tjIYEmJAKAzdfxF0dULn9zlAgBba6rQbd8s6c8kdUn6UkTc35JU64wO9VPgAFBDw6dcbHdJ+itJvyjpOkm3276uVcEAAPVp5hz6fkmvRMT3IuJ/Jf2dpIOtiQUAqFczhd4v6T/XPD6bjQEAStBMoXuDsXjXRvZh2zO2Z5aWlprYHQBgK80U+llJ16x5fLWkxfUbRcSRiBiOiOG+vr4mdgcA2Ioj3nVQne+J9i5J/y7pJkkLkv5V0q9FxEtbPGdJ0vcb2mHVbkmvNfH8opArv07MJJGrXuSqT7O5fjwiah4RN3zbYkRctH2XpGlVb1s8ulWZZ89p6hDd9kxEDDfzbxSBXPl1YiaJXPUiV33alaup+9Aj4klJT7YoCwCgCR3/1n8AQD7brdCPlB1gE+TKrxMzSeSqF7nq05ZcDV8UBQB0lu12hA4A2ETHFbrto7bP2z61yXrb/nPbr9h+0fb1HZLrRttv2D6Z/fxhGzJdY/tZ26dtv2T77g22aft85cxVxnz9sO1/sf1vWa4/2mCbH7L9lWy+nrc90CG57rS9tGa+fqvoXGv23WV71vYTG6xr+3zlyFTmXJ2xPZftd2aD9cW+HiOio34kfVjS9ZJObbL+FknfVPWdqjdIer5Dct0o6Yk2z9UeSddny5er+r6A68qer5y5ypgvS7osW+6W9LykG9Zt87uSvpgt3ybpKx2S605Jf9nO+Vqz79+X9MhG/73KmK8cmcqcqzOSdm+xvtDXY8cdoUfEc5Je32KTg5L+Oqr+WVKv7T0dkKvtIuJcRLyQLb8l6bTe/Xk6bZ+vnLnaLpuD/8oedmc/6y8iHZR0LFv+mqSbbG/0MRftzlUK21dL+iVJX9pkk7bPV45MnazQ12PHFXoOnfyhYD+b/dn8Tds/2c4dZ3/qDql6dLdWqfO1RS6phPnK/lQ/Kem8pKciYtP5ioiLkt6Q9KMdkEuSfiX7M/1rtq/ZYH0R/lTSH0h6e5P1ZcxXrUxSOXMlVf9H/G3bJ2wf3mB9oa/H7VjouT4UrAQvqPr23A9J+gtJU+3ase3LJD0m6Z6IeHP96g2e0pb5qpGrlPmKiJWI2KfqZw/tt/1T6zYpZb5y5Pp7SQMR8dOS/kH/f1RcGNu/LOl8RJzYarMNxgqbr5yZ2j5XaxyIiOtV/Z6IT9n+8Lr1hc7Xdiz0XB8K1m4R8ebqn81RfQdtt+3dRe/XdreqpflwRExusEkp81UrV1nztWb/y5L+UdLN61Zdmi9XP6/oR9TGU22b5YqIH0TE/2QPH5T0M22Ic0DSrbbPqPp9Bz9v+2/XbdPu+aqZqaS5Wt33Yvb7vKTHVf3eiLUKfT1ux0I/Luk3sqvFN0h6IyLOlR3K9o+tnju0vV/Vuf1Bwfu0pIcknY6IBzbZrO3zlSdXSfPVZ7s3W+6R9AuSvrtus+OSDmXLH5f0TGRXs8rMte48662qXpcoVESMR8TVETGg6gXPZyLi19dt1tb5ypOpjLnK9vte25evLkv6qKT1d8UV+nrsuC+Jtv2oqndA7LZ9VtJnVL1IpIj4oqqfHXOLpFck/bek3+yQXB+X9Du2L0qqSLqt6CJQ9WjlDklz2flXSbpP0rVrcpUxX3lylTFfeyQdc/XrE98j6asR8YTtP5Y0ExHHVf0f0d/YfkXVI83bCs6UN9fv2b5V0sUs151tyLWhDpivWpnKmqurJD2eHafskvRIRHzL9m9L7Xk98k5RAEjEdjzlAgDYAIUOAImg0AEgERQ6ACSCQgeARFDoAJAICh0AEkGhA0Ai/g/tw4vO3FHTXgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_values = [1,2,3,4,5]\n",
    "y_values = [1,4,9,16,25]\n",
    "plt.scatter(x_values,y_values)\n",
    "plt.savefig('figures/B.1.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x_values,y_values,marker='x',c='red')\n",
    "plt.savefig('figures/B.2.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x_values,y_values)\n",
    "plt.savefig('figures/B.3.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_segment(p1,p2):\n",
    "    x1,y1 = p1\n",
    "    x2,y2 = p2\n",
    "    plt.plot([x1,x2],[y1,y2],marker='o')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "point1 = (0,3)\n",
    "point2 = (2,1)\n",
    "plot_segment(point1,point2)\n",
    "plt.savefig('figures/B.4.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_values = np.arange(0,10,0.01)\n",
    "y_values = np.sin(x_values)\n",
    "plt.plot(x_values,y_values)\n",
    "plt.savefig('figures/B.5.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.ylim(0,5)\n",
    "plt.xlim(0,5)\n",
    "plot_segment(point1,point2)\n",
    "plt.savefig('figures/B.6.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.ylim(0,5)\n",
    "plt.xlim(0,5)\n",
    "plt.gcf().set_size_inches(5,5)\n",
    "plot_segment(point1,point2)\n",
    "plt.savefig('figures/B.7.svg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_values = np.arange(0,10,0.01)\n",
    "y_values = np.sin(x_values)\n",
    "plt.plot(x_values,y_values)\n",
    "plt.title('Graph of sin(x) vs. x',fontsize=16)\n",
    "plt.xlabel('this is the x value',fontsize=16)\n",
    "plt.ylabel('the value of sin(x)',fontsize=16)\n",
    "plt.savefig('figures/B.8.svg')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Object-oriented programming in Python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle():\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = Rectangle(3,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "__main__.Rectangle"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(r)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r.width"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r.height"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Defining methods\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle():\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h\n",
    "    \n",
    "    def area(self):\n",
    "        return self.width * self.height"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rectangle(3,4).area()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle():\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h\n",
    "    \n",
    "    def area(self):\n",
    "        return self.width * self.height\n",
    "    \n",
    "    def scale(self, factor):\n",
    "        return Rectangle(factor * self.width, factor * self.height)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r = Rectangle(2,1)\n",
    "s = r.scale(3)\n",
    "s.width"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.height"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Special methods\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'width': 2, 'height': 1}"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rectangle(2,1).__dict__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rectangle(3,4) == Rectangle(3,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle():\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h\n",
    "    \n",
    "    def area(self):\n",
    "        return self.width * self.height\n",
    "    \n",
    "    def scale(self, factor):\n",
    "        return Rectangle(factor * self.width, factor * self.height)\n",
    "    \n",
    "    def __eq__(self,other):\n",
    "        return self.width == other.width and self.height == other.height"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rectangle(3,4) == Rectangle(3,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle():\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h\n",
    "    \n",
    "    def area(self):\n",
    "        return self.width * self.height\n",
    "    \n",
    "    def scale(self, factor):\n",
    "        return Rectangle(factor * self.width, factor * self.height)\n",
    "    \n",
    "    def __eq__(self,other):\n",
    "        return self.width == other.width and self.height == other.height\n",
    "    \n",
    "    def __repr__(self):\n",
    "        return 'Rectangle (%r by %r)' % (self.width, self.height)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Rectangle (3 by 4)"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rectangle(3,4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Operator overloading"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle():\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h\n",
    "    \n",
    "    def area(self):\n",
    "        return self.width * self.height\n",
    "    \n",
    "    def scale(self, factor):\n",
    "        return Rectangle(factor * self.width, factor * self.height)\n",
    "    \n",
    "    def __eq__(self,other):\n",
    "        return self.width == other.width and self.height == other.height\n",
    "    \n",
    "    def __repr__(self):\n",
    "        return 'Rectangle (%r by %r)' % (self.width, self.height)\n",
    "    \n",
    "    def __mul__(self,factor):\n",
    "        return self.scale(factor)\n",
    "    \n",
    "    def __rmul__(self,factor):\n",
    "        return self.scale(factor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Rectangle (10 by 20)"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "10 * Rectangle(1,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Rectangle (10 by 20)"
      ]
     },
     "execution_count": 162,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rectangle(1,2) * 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Class methods"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle():\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h\n",
    "    \n",
    "    def area(self):\n",
    "        return self.width * self.height\n",
    "    \n",
    "    def scale(self, factor):\n",
    "        return Rectangle(factor * self.width, factor * self.height)\n",
    "    \n",
    "    def __eq__(self,other):\n",
    "        return self.width == other.width and self.height == other.height\n",
    "    \n",
    "    def __repr__(self):\n",
    "        return 'Rectangle (%r by %r)' % (self.width, self.height)\n",
    "    \n",
    "    def __mul__(self,factor):\n",
    "        return self.scale(factor)\n",
    "    \n",
    "    def __rmul__(self,factor):\n",
    "        return self.scale(factor)\n",
    "    \n",
    "    @classmethod\n",
    "    def square(cls,side):\n",
    "        return Rectangle(side,side)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Rectangle (5 by 5)"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Rectangle.square(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Inheritance and abstract classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Square(Rectangle):\n",
    "    \n",
    "    def __init__(self,s):\n",
    "        return super().__init__(s,s)\n",
    "    \n",
    "    def __repr__(self):\n",
    "        return \"Square (%r)\" % self.width"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Square(5).area()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import pi\n",
    "\n",
    "class Circle():\n",
    "    def __init__(self, r):\n",
    "        self.radius = r\n",
    "    \n",
    "    def area(self):\n",
    "        return pi * self.radius * self.radius\n",
    "    \n",
    "    def scale(self, factor):\n",
    "        return Circle(factor * self.radius)\n",
    "    \n",
    "    def __eq__(self,other):\n",
    "        return self.radius == other.radius\n",
    "    \n",
    "    def __repr__(self):\n",
    "        return 'Circle (radius %r)' % self.radius\n",
    "    \n",
    "    def __mul__(self,factor):\n",
    "        return self.scale(factor)\n",
    "    \n",
    "    def __rmul__(self,factor):\n",
    "        return self.scale(factor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [],
   "source": [
    "from abc import ABCMeta, abstractmethod\n",
    "\n",
    "class Shape(metaclass=ABCMeta):\n",
    "    @abstractmethod\n",
    "    def area(self):\n",
    "        pass\n",
    "    \n",
    "    @abstractmethod\n",
    "    def scale(self, factor):\n",
    "        pass\n",
    "    \n",
    "    def __eq__(self,other):\n",
    "        return self.__dict__ == other.__dict__\n",
    "    \n",
    "    def __mul__(self,factor):\n",
    "        return self.scale(factor)\n",
    "    \n",
    "    def __rmul__(self,factor):\n",
    "        return self.scale(factor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle(Shape):\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [],
   "source": [
    "#### this\n",
    "# Rectangle(1,3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Rectangle(Shape):\n",
    "    def __init__(self,w,h):\n",
    "        self.width = w\n",
    "        self.height = h\n",
    "        \n",
    "    def area(self):\n",
    "        return self.width * self.height\n",
    "    \n",
    "    def scale(self, factor):\n",
    "        return Rectangle(factor * self.width, factor * self.height)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "3 * Rectangle(1,2) == Rectangle(3,6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
